package 作业;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;

/**
 * \**训练目标**：掌握java中反射的基本使用
 * **需求描述**：定义一个标准的JavaBean，名叫Person，包含属性name、age。
 *   1.使用反射的方式创建一个实例、调用构造函数初始化name、age，
 *    2.使用反射方式调用setName方法对名称进行设置，不使用setAge方法，直接使用反射方式对age赋值。
 *    3.使用反射的方式设置age/name的Field
 * - 获取Person的字节码Class
 * - 通过Class获取有参构造方法
 * - 调用构造方法，创建Person对象
 * - 通过Class获取setName方法对象
 * - 执行setName方法对象
 * - 通过Class获取age的Field对象
 * - 设置属性
 */
public class PersonTest {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class clazz = Person.class;

        Constructor clazzConstructor = clazz.getConstructor(int.class, String.class);

        clazzConstructor.newInstance(18,"张三");

        Method setNameMethod = clazz.getMethod("setName", String.class);

        setNameMethod.invoke(new Person(18,"张三"),"李四");

        Field agefield = clazz.getDeclaredField("age");

        agefield.setAccessible(true);
        agefield.set(new Person(18,"张三"),18);
        System.out.println(new Person(18,"张三"));
    }
}
